package net.zio.kamenriderzioaddon.ridersystem.registry;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.zio.kamenriderzioaddon.enums.HenshinState;
import net.zio.kamenriderzioaddon.enums.SoundType;
import net.zio.kamenriderzioaddon.ridersystem.behavior.IAwakeningHenshinBehavior;
import net.zio.kamenriderzioaddon.ridersystem.data.PlayerDataManager;
import net.zio.kamenriderzioaddon.ridersystem.util.HenshinUtils;

import java.util.Map;
import java.util.function.Predicate;

/**
 * 强化形态配置类
 *
 * @author QianYunYi
 *
 * 该类包含强化形态的名称、套装物品、变身道具以及觉醒变身行为处理器。
 */
public class AwakeningConfig {

   //强化形态的名称。
    private final String name;
    //强化形态对应的盔甲套装数组。
    private final Item[] armorSet;
    //强化形态的变身条件函数。
    private final Predicate<Player> transformCondition;
    //强化形态所需的变身道具。
    private final Item mainHenshinItem;
    //强化形态副手的变身道具。
    private final Item offhandHenshinItem;
    //强化形态的变身行为处理器，用于处理强化变身相关逻辑。
    //强化形态变身行为处理器,用于处理强化形态变身相关逻辑
    private final IAwakeningHenshinBehavior awakeningHenshinBehavior;
    //强化形态的音效映射，用于存储不同音效类型对应的音效事件。
    private final Map<SoundType, SoundEvent> awakeningSounds;

    // 常量定义
    protected static final EquipmentSlot[] SLOTS = HenshinUtils.ARMOR_SLOTS;
    protected static final EquipmentSlot MAINHAND_SLOT = EquipmentSlot.MAINHAND;
    protected static final EquipmentSlot OFFHAND_SLOT = EquipmentSlot.OFFHAND;

    /**
     * 构造一个新的强化形态配置对象。
     *
     * @param name               强化形态的名称。
     * @param armorSet           强化形态对应的盔甲套装数组。
     * @param transformCondition 强化形态的变身条件函数。
     * @param mainHenshinItem    强化形态所需的变身道具。
     * @param deputyHenshinItem  强化形态副手的变身道具。
     * @param geizMajestySounds  强化形态的音效映射。
     * @param behavior           强化形态的变身行为处理器。
     */
    public AwakeningConfig(String name, Item[] armorSet,
                           Predicate<Player> transformCondition, Item mainHenshinItem, Item deputyHenshinItem, Map<SoundType, SoundEvent> geizMajestySounds, IAwakeningHenshinBehavior behavior) {
        this.name = name;
        this.armorSet = armorSet;
        this.transformCondition = transformCondition;
        this.mainHenshinItem = mainHenshinItem;
        this.offhandHenshinItem = deputyHenshinItem;
        this.awakeningSounds = geizMajestySounds;
        this.awakeningHenshinBehavior = behavior;
    }

    /**
     * 处理强化形态待机状态。
     *
     * @param player 玩家实例
     */
    public void handleStandbyAwakening(Player player,FullRiderConfig fullRiderConfig) {
        // 调用变身行为处理器的待机处理方法
        awakeningHenshinBehavior.handleStandbyAwakening(player, fullRiderConfig, this);
    }
    /**
     * 检查是否符合强化形态变身条件
     *
     * @param player 玩家实例
     * @return 如果符合条件返回 true，否则返回 false
     */
    public boolean canTransform(Player player) {
        return transformCondition.test(player);
    }

    /**
     * 处理强化形态变身。
     *
     * @param player 玩家实例
     * @param fullRiderConfig 基础骑士配置
     */
    public void handleAwakeningHenshin(Player player, FullRiderConfig fullRiderConfig) {
        awakeningHenshinBehavior.handleAwakeningHenshin(player, fullRiderConfig, this);
    }

    /**
     * 处理强化形态快速变身
     *
     * @param player 玩家实例
     * @param fullRiderConfig 基础骑士配置
     */
    public void handleQuickTransformation(Player player, FullRiderConfig fullRiderConfig) {
        if (awakeningHenshinBehavior != null) {
            awakeningHenshinBehavior.handleQuickTransformation(player, fullRiderConfig, this);
        }
    }

    /**
     * 处理强化形态解除。
     *
     * @param player 玩家实例
     * @param fullRiderConfig 基础骑士配置
     */
    public void handleAwakeningDeactivation(Player player, FullRiderConfig fullRiderConfig) {
        awakeningHenshinBehavior.handleAwakeningDeactivation(player, fullRiderConfig, this);
    }

    // 装备操作

    /**
     * 装备腰带
     *
     * @param player 玩家实例
     */
    public void equipBelt(Player player) {
        player.setItemSlot(EquipmentSlot.LEGS, new ItemStack(getBeltItem()));
    }

    /**
     * 装备完整装甲套装
     *
     * @param player 玩家实例
     */
    public void equipFullArmorSet(Player player) {
        for (int i = 0; i < SLOTS.length; i++) {
            player.setItemSlot(SLOTS[i], new ItemStack(armorSet[i]));
        }
    }


    // Getter方法
    // 核心getter
    public Item getBeltItem() {
        return armorSet[2]; // LEGS槽位对应腰带
    }
    /**
     * 获取强化形态的名称。
     *
     * @return 觉醒形态的名称。
     */
    public String getName() { return name; }

    /**
     * 强化形态对应的盔甲套装数组。
     *
     * @return 强化形态对应的盔甲套装数组。
     */
    public Item[] getArmorSet() { return armorSet; }


    //获取强化形态所需的主手变身道具
    public Item getMainHenshinItem() {
        return mainHenshinItem;
    }

    //获取强化形态所需的副手变身道具
    public Item getOffhandHenshinItem() {
        return offhandHenshinItem;
    }

    // 检查是否有副手道具
    public boolean hasDeputyItem() {
        return offhandHenshinItem != null;
    }

    /**
     * 获取强化形态的变身行为处理器。
     *
     * @return 强化形态的变身行为处理器。
     */
    public IAwakeningHenshinBehavior getBehavior() { return awakeningHenshinBehavior; }

    /**
     * 获取强化形态的变身条件函数。
     *
     * @return 强化形态的变身条件函数。
     */
    public Predicate<Player> getTransformCondition() {
        return transformCondition;
    }

    /**
     * 获取强化形态的音效映射。
     *
     * @return 强化形态的音效映射。
     */
    public Map<SoundType, SoundEvent> getAwakeningSounds() {
        return awakeningSounds;
    }

    /**
     * 设置强化形态的待机装备数据。
     *
     * @param player 玩家实例
     * @param gearData 装备数据
     */
    public void setStandbyGear(Player player, CompoundTag gearData) {
        PlayerDataManager.get(player).setStandbyGear(gearData);
    }

    /**
     * 保存强化形态的标准变身装备数据。
     *
     * @param player 玩家实例
     * @param gearData 装备数据
     */
    public void setActiveGear(Player player, CompoundTag gearData) {
        PlayerDataManager.get(player).setActiveGear(gearData);
    }
}
